﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entidades;
using Logica;

namespace Logica
{
    public class ReportesBLL
    {
        public List<ReporteBusDiaDTO> ReporteRutaDia (string Ruta, DateTime Fecha)
        {
            DateTime FechaInicial = new DateTime(Fecha.Year, Fecha.Month, Fecha.Day, 0, 0, 0);
            DateTime FechaFinal = new DateTime(Fecha.Year, Fecha.Month, Fecha.Day, 23, 59, 59);
            justimeEntities bd = new justimeEntities();
            ruta DatosRuta = bd.rutas.Where(t => t.NomRuta == Ruta).FirstOrDefault();
            List<ReporteBusDiaDTO> lReporte = new List<ReporteBusDiaDTO>();
            if (DatosRuta != null)
            {
                int TiempoMaxRecorrido = int.Parse(DatosRuta.TiempoRecorrido.ToString());
                List<controlbus> BusesRutaDia = bd.controlbuses.Where(t => t.Fecha > FechaInicial && t.Fecha < FechaFinal && t.NomRuta == Ruta).ToList();
                if (BusesRutaDia != null)
                {
                    foreach (controlbus item in BusesRutaDia)
                    {
                        List<string> lColeadas = new List<string>();
                        string Conductor = item.NomConductorl;
                        List<historialmovimiento> SalidasBusDia = bd.historialmovimientos.Where(t => t.Placa == item.Placa && t.Fecha > FechaInicial && t.Fecha < FechaFinal && t.Punto == "SALIO DESPACHO").OrderBy(t => t.Fecha).ToList();
                        if (SalidasBusDia != null)
                        {
                            int NumeroRecorridos = SalidasBusDia.Count;                            
                            for (int i = 0; i < SalidasBusDia.Count; i++)
                            {
                                DateTime FechaMiDia = SalidasBusDia[i].Fecha;
                                historialmovimiento Llegada = bd.historialmovimientos.Where(t => t.Placa == item.Placa && t.Punto == "DESPACHO" && t.Fecha > FechaMiDia).OrderBy(t=>t.Fecha).FirstOrDefault();
                                TimeSpan Diferencia = Llegada.Fecha - FechaMiDia;
                                int MinutosDiferencia = Diferencia.Minutes + Diferencia.Hours * 60;
                                if (MinutosDiferencia > TiempoMaxRecorrido)
                                {

                                    lColeadas.Add((MinutosDiferencia - TiempoMaxRecorrido).ToString());
                                }
                            }                            
                        }
                        ReporteBusDiaDTO Reporte = new ReporteBusDiaDTO();
                        Reporte.Conductor = Conductor;
                        Reporte.Placa = item.Placa;
                        Reporte.TiempoLlegadasTarde = lColeadas;
                        Reporte.NumeroRecorridos = SalidasBusDia.Count.ToString();
                        lReporte.Add(Reporte);
                    }
                }
                return lReporte;
            }
            else
            {
                return null;
            }
        }

        public List<ReporteRecorridoDTO> ReporteBusRecorridos(DateTime Fecha, string Placa)
        {
            DateTime FechaInicial = new DateTime(Fecha.Year, Fecha.Month, Fecha.Day, 0, 0, 0);
            DateTime FechaFinal = new DateTime(Fecha.Year, Fecha.Month, Fecha.Day, 23, 59, 59);
            justimeEntities bd = new justimeEntities();
            List<ReporteRecorridoDTO> lRecorridos = new List<ReporteRecorridoDTO>();
            List<historialmovimiento> lHistoriaBus = bd.historialmovimientos.Where(t => t.Placa == Placa && t.Fecha > FechaInicial && t.Fecha < FechaFinal).OrderBy(t => t.Fecha).ToList();
            if (lHistoriaBus != null)
            {
                List<historialmovimiento> lSalidas = bd.historialmovimientos.Where(t => t.Placa == Placa && t.Fecha > FechaInicial && t.Fecha < FechaFinal && t.Punto == "SALIO DESPACHO").OrderBy(t => t.Fecha).ToList();
                if (lSalidas != null)
                {
                    int NumeroRecorridos = lSalidas.Count;
                    for (int j = 0; j < lSalidas.Count; j++)
                    {
                        ReporteRecorridoDTO ReporteRecorridoS = new ReporteRecorridoDTO();
                        List<PuntosControlDTO> PuntosControlS = new List<PuntosControlDTO>();
                        DateTime HoraSalidaS = lSalidas[j].Fecha;
                        ReporteRecorridoS.NumeroRecorrido = (j+1).ToString();
                        ReporteRecorridoS.HoraSalida = HoraSalidaS.TimeOfDay.ToString();
                        historialmovimiento HoraLlegadaS = bd.historialmovimientos.Where(t => t.Placa == Placa && t.Fecha > HoraSalidaS && t.Punto == "DESPACHO").OrderBy(t => t.Fecha).FirstOrDefault();
                        if (HoraLlegadaS != null)
                        {
                            DateTime HoraLlegadaSR = HoraLlegadaS.Fecha;
                            ReporteRecorridoS.HoraLlegada = HoraLlegadaSR.TimeOfDay.ToString();
                            TimeSpan DiferenciaS = HoraLlegadaSR - HoraSalidaS;
                            int MinutesRecorrido = DiferenciaS.Hours * 60 + DiferenciaS.Minutes;
                            ReporteRecorridoS.TiempoRecorrido = MinutesRecorrido.ToString();

                            List<historialmovimiento> HistorialPuntosControlS = bd.historialmovimientos.Where(t => t.Placa == Placa && t.Fecha > HoraSalidaS && t.Fecha < HoraLlegadaSR && t.Punto != "DESPACHO" && t.Punto != "false" && t.Punto != "SALIO DESPACHO").OrderBy(t => t.Fecha).ToList();
                            if (HistorialPuntosControlS != null)
                            {
                                foreach (historialmovimiento item3 in HistorialPuntosControlS)
                                {
                                    PuntosControlDTO ControlS = new PuntosControlDTO();
                                    ControlS.Fecha = item3.Fecha.TimeOfDay.ToString();
                                    ControlS.Punto = item3.Punto;
                                    PuntosControlS.Add(ControlS);
                                }
                                ReporteRecorridoS.PuntosDeControl = PuntosControlS;
                            }
                            lRecorridos.Add(ReporteRecorridoS);
                        }                     
                    }
                    return lRecorridos;
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }
    }
}
